home *** CD-ROM | disk | FTP | other *** search
/ HPAVC / HPAVC CD-ROM.iso / pc / 3DTOSHI2.ZIP / mpg3d / source / Lg3d256w.asm < prev    next >
Encoding:
Assembly Source File  |  1996-05-01  |  11.1 KB  |  579 lines

  1.  
  2. ; lg3d256w.asm
  3. ;
  4. ; Copyright (c) 1996 by Toshiaki Tsuji, all rights reserved.
  5.  
  6. ; Functions
  7. PUBLIC _SetEdgeData_
  8. PUBLIC _SetDestData_
  9. PUBLIC _SetGradientData_
  10. PUBLIC _SetShadeTable_ 
  11. PUBLIC _SetTextureBuffer_ 
  12.  
  13. PUBLIC _ScanEdgeSolid_, _DrawSolidPoly_
  14. PUBLIC _ScanEdgeSolidGouraud_, _DrawSolidGouraudPoly_
  15. PUBLIC _ScanEdgeTexture_, _DrawTexturePoly_
  16.  
  17. .DATA
  18.   LeftEdge  DD 0
  19.   RightEdge DD 0
  20.   EdgeSize  DD 0
  21.  
  22.   DestBuffer DD 0
  23.   AddDest DD 0
  24.  
  25.   LeftX DD 0
  26.   RightX DD 0
  27.   RowStepX DD 0
  28.  
  29.   ExtraHt DD 0
  30.  
  31.   OneOverZdX DD 0
  32.   OneOverZdY DD 0
  33.  
  34.   UOverZdX DD 0
  35.   UOverZdY DD 0
  36.   UOverZRowStep DD 0
  37.   UOverZInStep DD 0
  38.  
  39.   VOverZdX DD 0
  40.   VOverZdY DD 0
  41.   VOverZRowStep DD 0
  42.   VOverZInStep DD 0
  43.  
  44.   IOverZdX DD 0
  45.   IOverZdY DD 0
  46.   IOverZRowStep DD 0
  47.   IOverZInStep DD 0
  48.         
  49.   HOverZdX DD 0
  50.   HOverZdY DD 0
  51.   HOverZRowStep DD 0
  52.   HOverZInStep DD 0
  53.  
  54.   ShadeBuffer DD 0
  55.   TextureBuffer DD 0
  56.  
  57. XOffset EQU  0
  58. YOffset EQU  4
  59. UOffset EQU  8
  60. VOffset EQU 12
  61. IOffset EQU 16
  62. HOffset EQU 20
  63. SizeOfEdge EQU 32
  64.  
  65.  
  66. .CODE
  67. .486
  68.  
  69. ; _SetEdgeData ( FXPEDGE *LeftEdgePtr, FXPEDGE *RightEdgePtr, LONG EdgeSize )
  70. ;
  71. ; EAX = LeftEdgePtr, EDX = RightEdgePtr, EBX = EdgeSize
  72.  
  73. _SetEdgeData_ PROC
  74.   mov  LeftEdge, EAX
  75.   mov  RightEdge, EDX
  76.   mov  EdgeSize, EBX
  77.   ret
  78. _SetEdgeData_ ENDP
  79.  
  80.  
  81. ; _SetDestData_ ( BYTE *DestBuffer, LONG AddDest )
  82. ;
  83. ; EAX = DestBuffer, EDX = AddDest
  84.  
  85. _SetDestData_ PROC
  86.   mov DestBuffer, EAX
  87.   mov AddDest, EDX 
  88.   ret
  89. _SetDestData_ ENDP
  90.  
  91.  
  92. ; _SetGradientData_ ( FXPGRADIENT *Gradient )
  93. ;
  94. ; EAX = Gradient
  95.  
  96. _SetGradientData_ PROC
  97.   push ESI
  98.  
  99.   mov  ESI, EAX
  100.  
  101.   mov  EAX, [ESI+0]
  102.   mov  OneOverZdX, EAX
  103.   mov  EAX, [ESI+4]
  104.   mov  OneOverZdY, EAX
  105.  
  106.   mov  EAX, [ESI+8]
  107.   mov  UOverZdX, EAX
  108.   mov  EAX, [ESI+12]
  109.   mov  UOverZdY, EAX
  110.  
  111.   mov  EAX, [ESI+16]
  112.   mov  VOverZdX, EAX
  113.   mov  EAX, [ESI+20]
  114.   mov  VOverZdY, EAX
  115.  
  116.   mov  EAX, [ESI+24]
  117.   mov  IOverZdX, EAX
  118.   mov  EAX, [ESI+28]
  119.   mov  IOverZdY, EAX
  120.  
  121.   mov  EAX, [ESI+32]
  122.   mov  HOverZdX, EAX
  123.   mov  EAX, [ESI+36]
  124.   mov  HOverZdY, EAX
  125.  
  126.   pop  ESI
  127.   ret
  128. _SetGradientData_ ENDP
  129.  
  130.  
  131. ; _SetShadeTable ( BYTE *Table )
  132. ;
  133. ; EAX = Table
  134.  
  135. _SetShadeTable_ PROC
  136.   mov  ShadeBuffer, EAX
  137.   ret
  138. _SetShadeTable_ ENDP
  139.  
  140.  
  141. ; _SetTextureBuffer ( BYTE *Buffer )
  142. ;
  143. ; EAX = Buffer
  144.  
  145. _SetTextureBuffer_ PROC
  146.   mov  TextureBuffer, EAX
  147.   ret
  148. _SetTextureBuffer_ ENDP
  149.  
  150.  
  151. ;***********************************************
  152. ;
  153. ; Solid, No Shading
  154. ;
  155. ;***********************************************
  156.  
  157. ; FXPEDGE* _ScanEdgeSolid ( FXPPOINT2D *Point1, FXPPOINT2 *Point2,
  158. ;                           FXPEDGE *EdgePtr, LONG ExtraHt )
  159. ;
  160. ; EAX = Point1, EDX = Point2, EBX = EdgePtr, LONG ExtraHt
  161.  
  162. _ScanEdgeSolid_ PROC
  163.   push EBP
  164.   push EDI
  165.   push ESI
  166.  
  167.   mov  ESI, EAX
  168.   mov  EDI, EDX
  169.   mov  EBP, EBX
  170.   mov  ExtraHt, ECX
  171.  
  172.   ;  All X coords are in 16:16, Y is in Integer
  173.   mov  ECX, dword ptr [EDI+YOffset]
  174.   sub  ECX, dword ptr [ESI+YOffset] ; ECX is the Height
  175.  
  176.   mov  EAX, dword ptr [EDI]
  177.   mov  EBX, dword ptr [ESI]  ; EBX is the TopX
  178.   sub  EAX, EBX
  179.   cdq 
  180.   idiv ECX                   ; EAX is the StepX
  181.    
  182.   add  ECX, ExtraHt
  183.  
  184.   ScanEdgeSolidHtLoop :
  185.     mov  [EBP], EBX
  186.     add  EBX, EAX
  187.     add  EBP, SizeOfEdge     ; FXPEDGE is 32 bytes
  188.     dec  ECX
  189.     jz   EndScanEdgeSolidHtLoop
  190.  
  191.     mov  [EBP], EBX
  192.     add  EBX, EAX
  193.     add  EBP, SizeOfEdge     ; FXPEDGE is 32 bytes
  194.     dec  ECX
  195.     jz   EndScanEdgeSolidHtLoop
  196.  
  197.     mov  [EBP], EBX
  198.     add  EBX, EAX
  199.     add  EBP, SizeOfEdge     ; FXPEDGE is 32 bytes
  200.     dec  ECX
  201.     jz   EndScanEdgeSolidHtLoop
  202.  
  203.     mov  [EBP], EBX
  204.     add  EBX, EAX
  205.     add  EBP, SizeOfEdge     ; FXPEDGE is 32 bytes
  206.     dec  ECX
  207.     jnz  ScanEdgeSolidHtLoop
  208.  
  209.   EndScanEdgeSolidHtLoop :
  210.  
  211.   mov  EAX, EBP
  212.   pop  ESI
  213.   pop  EDI
  214.   pop  EBP
  215.   ret
  216. _ScanEdgeSolid_ ENDP
  217.  
  218.  
  219. ; _DrawSolidPoly ( LONG Color, LONG Intensity, LONG Skip, LONG LoopCount )
  220. ;
  221. ; EAX = Color, EDX = Intensity, EBX = Skip, ECX =LoopCount
  222.  
  223. _DrawSolidPoly_ PROC
  224.   push EBP
  225.   push EDI
  226.   push ESI
  227.  
  228.   mov  AH, AL
  229.   mov  EBX, EAX
  230.   shl  EAX, 16
  231.   mov  AX, BX
  232.  
  233.   DrawSolidPolyHtLoop :
  234.     cld
  235.     mov  ESI, LeftEdge
  236.     mov  EBP, RightEdge
  237.  
  238.     mov  EBX, dword ptr [ESI]
  239.     mov  EDX, dword ptr [EBP]
  240.     add  ESI, SizeOfEdge           ; FXPEDGE is 32 bytes
  241.     add  EBP, SizeOfEdge           ; FXPEDGE is 32 bytes
  242.     sar  EBX, 16
  243.     sar  EDX, 16
  244.  
  245.     mov  LeftEdge, ESI
  246.     mov  RightEdge, EBP
  247.  
  248.     push ECX
  249.  
  250.     mov  ECX, DestBuffer
  251.     mov  EDI, ECX
  252.     add  ECX, AddDest
  253.     add  EDI, EBX
  254.     mov  DestBuffer, ECX
  255.  
  256.     mov  ECX, EDX
  257.     sub  ECX, EBX
  258.     inc  ECX
  259.     mov  EDX, ECX
  260.  
  261.     and  EDX, 03h
  262.     shr  ECX, 2
  263.  
  264.     rep  stosd
  265.     mov  ECX, EDX
  266.     rep  stosb
  267.  
  268.     pop  ECX
  269.     loop DrawSolidPolyHtLoop
  270.  
  271.   pop  ESI
  272.   pop  EDI
  273.   pop  EBP
  274.   ret
  275. _DrawSolidPoly_ ENDP
  276.  
  277. ;***********************************************
  278. ;
  279. ; Solid, Gouraud Shading
  280. ;
  281. ;***********************************************
  282.  
  283. ; FXPEDGE* _ScanEdgeSolidGouraud ( FXPPOINT2D *Point1, FXPPOINT2 *Point2,
  284. ;                                  FXPEDGE *EdgePtr, LONG ExtraHt )
  285. ;
  286. ; EAX = Point1, EDX = Point2, EBX = EdgePtr, LONG ExtraHt
  287.  
  288. _ScanEdgeSolidGouraud_ PROC
  289.   push EBP
  290.   push EDI
  291.   push ESI
  292.  
  293.   mov  ESI, EAX
  294.   mov  EDI, EDX
  295.   mov  EBP, EBX
  296.   mov  ExtraHt, ECX
  297.  
  298.   ;  All X coords are in 16:16, Y is in Integer
  299.   mov  ECX, dword ptr [EDI+YOffset]
  300.   sub  ECX, dword ptr [ESI+YOffset] ; ECX is the Height
  301.  
  302.   mov  EAX, dword ptr [EDI]
  303.   mov  EBX, dword ptr [ESI]  ; EBX is the TopX
  304.   sub  EAX, EBX
  305.   cdq 
  306.   idiv ECX                   ; EAX is the StepX
  307.  
  308.   mov  RowStepX, EAX
  309.  
  310.   mov  EDX, IOverZdX
  311.   imul EDX
  312.   shrd EAX, EDX, 16
  313.   add  EAX, IOverZdY         ; EAX is the StepI
  314.   mov  IOverZRowStep, EAX    
  315.  
  316.   add  ECX, ExtraHt
  317.  
  318.   mov  ESI, dword ptr [ESI+IOffset]  ; ESI is the TopI
  319.   mov  EAX, RowStepX
  320.   mov  EDX, IOverZRowStep
  321.  
  322.   ScanEdgeSolidGouraudHtLoop :
  323.     mov  [EBP], EBX
  324.     add  EBX, EAX
  325.     mov  [EBP+IOffset], ESI
  326.     add  ESI, EDX
  327.     add  EBP, SizeOfEdge       ; FXPEDGE is 32 bytes
  328.     dec  ECX
  329.     jnz  ScanEdgeSolidGouraudHtLoop
  330.  
  331.   mov  EAX, EBP
  332.   pop  ESI
  333.   pop  EDI
  334.   pop  EBP
  335.   ret
  336. _ScanEdgeSolidGouraud_ ENDP
  337.  
  338.  
  339. ; _DrawSolidGouraudPoly ( LONG Color, LONG Intensity, LONG Skip, LONG LoopCount )
  340. ;
  341. ; EAX = Color, EDX = Intensity, EBX = Skip, ECX =LoopCount
  342.  
  343. _DrawSolidGouraudPoly_ PROC
  344.   push EBP
  345.   push EDI
  346.   push ESI
  347.  
  348.   mov  AH, AL
  349.   mov  EBX, EAX
  350.   shl  EAX, 16
  351.   mov  AX, BX
  352.  
  353.   DrawSolidGouraudPolyHtLoop :
  354.     cld
  355.     push ECX
  356.  
  357.     mov  ESI, LeftEdge
  358.     mov  EBP, RightEdge
  359.  
  360.     mov  EBX, dword ptr [ESI]
  361.     mov  EDX, dword ptr [EBP]
  362.     sar  EBX, 16
  363.     sar  EDX, 16
  364.  
  365.     mov  ECX, DestBuffer
  366.     mov  EDI, ECX
  367.     add  ECX, AddDest
  368.     add  EDI, EBX
  369.     mov  DestBuffer, ECX
  370.  
  371.     mov  ECX, EDX
  372.     sub  ECX, EBX
  373.     inc  ECX          ; ECX is Width of scanline
  374.  
  375.     mov  EBX, dword ptr [ESI+IOffset] ; EBX is I in 16:16
  376.  
  377.     add  ESI, SizeOfEdge          ; FXPEDGE is 32 bytes
  378.     add  EBP, SizeOfEdge          ; FXPEDGE is 32 bytes
  379.     mov  LeftEdge, ESI
  380.     mov  RightEdge, EBP
  381.  
  382.     mov  ESI, ShadeBuffer
  383.     mov  EBP, IOverZdX
  384.  
  385.     DrawSolidGouraudPolyInLoop :
  386.       mov  EDX, EBX
  387.       shr  EDX, 8
  388.       mov  DL, AH
  389.       mov  AL, [ESI+EDX]
  390.       add  EBX, EBP
  391.       stosb 
  392.       loop DrawSolidGouraudPolyInLoop 
  393.  
  394.     pop  ECX
  395.     loop DrawSolidGouraudPolyHtLoop
  396.  
  397.   pop  ESI
  398.   pop  EDI
  399.   pop  EBP
  400.   ret
  401. _DrawSolidGouraudPoly_ ENDP
  402.  
  403.  
  404. ;***********************************************
  405. ;
  406. ; Texture, No Shading
  407. ;
  408. ;***********************************************
  409.  
  410. ; FXPEDGE* _ScanEdgeTexture ( FXPPOINT2D *Point1, FXPPOINT2 *Point2,
  411. ;                                  FXPEDGE *EdgePtr, LONG ExtraHt )
  412. ;
  413. ; EAX = Point1, EDX = Point2, EBX = EdgePtr, LONG ExtraHt
  414.  
  415. _ScanEdgeTexture_ PROC
  416.   push EBP
  417.   push EDI
  418.   push ESI
  419.  
  420.   mov  ESI, EAX
  421.   mov  EDI, EDX
  422.   mov  EBP, EBX
  423.   mov  ExtraHt, ECX
  424.  
  425.   ;  All X coords are in 16:16, Y is in Integer
  426.   mov  ECX, dword ptr [EDI+YOffset]
  427.   sub  ECX, dword ptr [ESI+YOffset] ; ECX is the Height
  428.  
  429.   mov  EAX, dword ptr [EDI]
  430.   mov  EBX, dword ptr [ESI]  ; EBX is the TopX
  431.   sub  EAX, EBX
  432.   cdq 
  433.   idiv ECX                   ; EAX is the StepX
  434.  
  435.   mov  RowStepX, EAX
  436.  
  437.   mov  EDX, UOverZdX
  438.   imul EDX
  439.   shrd EAX, EDX, 16
  440.   add  EAX, UOverZdY         ; EAX is the StepU
  441.   mov  UOverZRowStep, EAX    
  442.  
  443.   mov  EAX, RowStepX
  444.   mov  EDX, VOverZdX
  445.   imul EDX
  446.   shrd EAX, EDX, 16
  447.   add  EAX, VOverZdY         ; EAX is the StepV
  448.   mov  VOverZRowStep, EAX    
  449.  
  450.   add  ECX, ExtraHt
  451.  
  452.   mov  ESI, dword ptr [ESI+UOffset]  ; ESI is the TopU
  453.   mov  EDI, dword ptr [ESI+VOffset]  ; EDI is the TopV
  454.   mov  EAX, RowStepX
  455.   mov  EDX, UOverZRowStep
  456.  
  457.   ScanEdgeTextureHtLoop :
  458.     mov  [EBP], EBX
  459.     add  EBX, EAX
  460.     mov  [EBP+UOffset], ESI
  461.     add  ESI, EDX
  462.     mov  [EBP+VOffset], EDI
  463.     add  EDI, VOverZRowStep
  464.     add  EBP, SizeOfEdge       ; FXPEDGE is 32 bytes
  465.     dec  ECX
  466.     jnz  ScanEdgeTextureHtLoop
  467.  
  468.   mov  EAX, EBP
  469.   pop  ESI
  470.   pop  EDI
  471.   pop  EBP
  472.   ret
  473. _ScanEdgeTexture_ ENDP
  474.  
  475.  
  476. ; _DrawTexturePoly ( LONG Color, LONG Intensity, LONG Skip, LONG LoopCount )
  477. ;
  478. ; EAX = Color, EDX = Intensity, EBX = Skip, ECX =LoopCount
  479.  
  480. _DrawTexturePoly_ PROC
  481.   push EBP
  482.   push EDI
  483.   push ESI
  484.  
  485.   mov  AH, AL
  486.   mov  EBX, EAX
  487.   shl  EAX, 16
  488.   mov  AX, BX
  489.  
  490.   DrawTexturePolyHtLoop :
  491.     cld
  492.     push ECX
  493.  
  494.     mov  ESI, LeftEdge
  495.     mov  EBP, RightEdge
  496.  
  497.     mov  EBX, dword ptr [ESI]
  498.     mov  EDX, dword ptr [EBP]
  499.     sar  EBX, 16
  500.     sar  EDX, 16
  501.  
  502.     mov  ECX, DestBuffer
  503.     mov  EDI, ECX
  504.     add  ECX, AddDest
  505.     add  EDI, EBX
  506.     mov  DestBuffer, ECX
  507.  
  508.     mov  ECX, EDX
  509.     sub  ECX, EBX
  510.     inc  ECX          ; ECX is Width of scanline
  511.  
  512.     mov  EBX, dword ptr [ESI+UOffset] ; EBX is U in 16:16
  513.     mov  EDX, dword ptr [ESI+VOffset] ; EDX is V in 16:16
  514.  
  515.     add  ESI, SizeOfEdge          ; FXPEDGE is 32 bytes
  516.     add  EBP, SizeOfEdge          ; FXPEDGE is 32 bytes
  517.     mov  LeftEdge, ESI
  518.     mov  RightEdge, EBP
  519.  
  520.     mov  ESI, TextureBuffer
  521.     mov  EBP, UOverZdX
  522.     shl  EBX, 8      ; EBX is U in 8:24
  523.     shl  EBP, 8      ; EBP is StepU in 8:24
  524.  
  525.     DrawTexturePolyInLoop :
  526.       mov  EAX, EDX
  527.       shr  EAX, 16
  528.       shld EAX, EBX, 8
  529.       add  EDX, VOverZdX
  530.       add  EBX, EBP
  531.       mov  AL, [ESI+EAX]
  532.       stosb
  533.       dec ECX
  534.       jz  EndDrawTexturePolyInLoop
  535.  
  536.       mov  EAX, EDX
  537.       shr  EAX, 16
  538.       shld EAX, EBX, 8
  539.       add  EDX, VOverZdX
  540.       add  EBX, EBP
  541.       mov  AL, [ESI+EAX]
  542.       stosb
  543.       dec ECX
  544.       jz  EndDrawTexturePolyInLoop
  545.  
  546.       mov  EAX, EDX
  547.       shr  EAX, 16
  548.       shld EAX, EBX, 8
  549.       add  EDX, VOverZdX
  550.       add  EBX, EBP
  551.       mov  AL, [ESI+EAX]
  552.       stosb
  553.       dec ECX
  554.       jz  EndDrawTexturePolyInLoop
  555.  
  556.       mov  EAX, EDX
  557.       shr  EAX, 16
  558.       shld EAX, EBX, 8
  559.       add  EDX, VOverZdX
  560.       add  EBX, EBP
  561.       mov  AL, [ESI+EAX]
  562.       stosb
  563.       dec ECX
  564.       jnz DrawTexturePolyInLoop
  565.  
  566.     EndDrawTexturePolyInLoop :
  567.  
  568.     pop  ECX
  569.     dec  ECX
  570.     jnz  DrawTexturePolyHtLoop
  571.  
  572.   pop  ESI
  573.   pop  EDI
  574.   pop  EBP
  575.   ret
  576. _DrawTexturePoly_ ENDP
  577.  
  578. END
  579.